/**
 * @author rxliuli
 */
const {
    CombinedPredicate: {
        not,
    },
    stringValidator: {
        isIpv4,
    },
    compare,
} = rx
const validate = (() => {
    const notIpv4 = not(isIpv4)
    let checkIpArr = (start, end) => (_v, form) => {
        const fn = name => form[name].split('.').slice(0, 3)
        return !compare(fn(start), fn(end))
    }
    let checkIpLast = (start, end) => (_v, form) => {
        const last = name => form[name].split('.')[3]
        return last(start) > last(end)
    }
    return RxFormValidator.validator({
        rxElemValidators: [
            RxElemValidator.notBlank('houseId', '[所在机房] 不能为空'),
            RxElemValidator.notBlank('sourceCompany', '[来源单位] 不能为空'),
            RxElemValidator.notBlank('assignCompany', '[分配单位] 不能为空'),
            RxElemValidator.notBlank('startIp', '[起始IP地址] 不能为空'),
            RxElemValidator.notBlank('endIp', '[终止IP地址] 不能为空'),
            RxElemValidator.notBlank('useType', '[使用方式] 不能为空'),
            /*RxElemValidator.notBlank('useCompany', '[使用单位] 不能为空'),*/
            RxElemValidator.notBlank('companyAttr', '[单位属性] 不能为空'),
            /*RxElemValidator.notBlank('idType', '[证件类型] 不能为空'),
            RxElemValidator.notBlank('idNumber', '[证件号码] 不能为空'),*/
            RxElemValidator.notBlank('assignUseTime', '[分配使用时间] 不能为空'),

            RxElemValidator.limitLen('sourceCompany', '[来源单位] 长度最大为 100 位', 100),
            RxElemValidator.limitLen('assignCompany', '[分配单位] 长度最大为 100 位', 100),
            RxElemValidator.limitLen('startIp', '[起始IP地址] 长度最大为 64 位', 64),
            RxElemValidator.limitLen('endIp', '[终止IP地址] 长度最大为 64 位', 64),
            RxElemValidator.limitLen('useCompany', '[使用单位] 长度最大为 64 位', 64),
            RxElemValidator.limitLen('idNumber', '[证件号码] 长度最大为 50 位', 50),

            RxElemValidator.create('startIp', '[起始IP地址] 格式错误，示例: 192.168.1.1', notIpv4),
            RxElemValidator.create('endIp', '[终止IP地址] 格式错误，示例: 192.168.1.255', notIpv4),
            RxElemValidator.create('ip', '[起始IP地址] 和 [终止IP地址] 必须在同一网段下（前三位相同），示例: [192.168.1.1, 192.168.1.255]', checkIpArr('startIp', 'endIp')),
            RxElemValidator.create('ip', '[终止 IP 地址] 最后一位的地址必须大于 [起始 IP 地址]，示例: [192.168.1.1, 192.168.1.255]', checkIpLast('startIp', 'endIp')),
        ],
    })
})()